Migration risk is mostly a data-modelling problem
The fear is losing data. The actual failure is data that arrives intact and means something different than it did before.
Nobody loses the records
Exports work. Imports work. In a decade of moving businesses between systems, the thing that goes wrong is almost never a missing row.
The real failure
A field that meant two things. An appointment type called "consult" that one provider uses for new patients and another uses for a follow-up. A status flag that was repurposed three years ago and never renamed.
Move that across faithfully and the new system inherits an ambiguity that was survivable when a human interpreted it and is not survivable when software acts on it.
So we read the data before we move it
Every field gets a definition agreed with the person who uses it. Where two people disagree, that is the finding, and it gets resolved before anything is exported. This is the slow part and it is where migrations are won.
Move less than you think
Active records and future commitments have to be live on day one. History usually needs to be readable, not live. Deciding that early removes most of the work and nearly all of the risk.
Verify against the old system
Not a spot check. A full comparison of everything scheduled ahead, run before cutover. One missing appointment is a customer standing at a desk, which is worth an afternoon of checking.
One writer at a time
Both systems can be open. Only one takes new work. Parallel running fails the moment two systems can both write, and works perfectly when the old one is a read-only reference for a week.